# @Author：silence
# @Email：792245022@qq.com
# @Date：2025/1/19 18:03

"""
1、函数的参数列表是多个，也可以没有
2、函数的命名遵循标识符命名规则和规范。
3、函数中的变量是局部的，函数外不生效
4、如果同一个文件，出现两个函数名相同的函数，则以就近原则进行调用（没有函数重载）
"""

"""
5、调用函数时，根据函数定义的参数位置来传递参数，这种传参方式就是 位置参数，
传递的实参和定义的 形参顺序 和 个数 必须一致，同时定义的形参，不用指定数据类型
会根据传入的实参决定
"""


def car_info(name, price, color):
    print(f"name = {name}, price = {price}, color = {color}")


# 传递的实参和定义的形参顺序个数必须一致，否则报 TypeError 错误
# car_info("宝马", 50_0000, "red", 11)

"""
6、函数可以有多个返回值，返回数据类型不受限制
"""


def f2(n1, n2):
    return n1 + n2, n1 - n2


r1, r2 = f2(10, 20)
print(f"r1 = {r1}, r2 = {r2}")

"""
7、函数支持关键字参数
- 函数调用时，可以通过 "形参名=实参名" 形式传递参数
- 这样可以不受参数传递顺序的限制
"""


def book_info(name, price, author, amount):
    print(f"name = {name}, price = {price}, author = {author}, amount = {amount}")


book_info("红楼梦", 60, amount=6000, author="曹雪芹")

"""
8、函数支持默认参数/缺省参数
- 定义函数时，可以给参数提供默认值，调用函数时，指定了实参，则以指定为准，没有指定，则以默认值为准
- 默认参数，需要放在参数列表后
"""


def book_info2(name="<<thinking in python>>", price=66.8, author="鬼叔", amount=1000):
    print(f"name = {name}, price = {price}, author = {author}, amount = {amount}")


book_info2()
book_info2("<<study python>>")


# 默认参数，需要放在参数列表后
def book_info3(name, price, author="鬼叔", amount=1000):
    print(f"name = {name}, price = {price}, author = {author}, amount = {amount}")


book_info3("<<python 揭秘>>", 999)

"""
9、函数支持可变参数/不定长参数
- 应用场景：当调用函数时，不确定传入多少个实参的情况
- 传入的多个实参，会被组成一个元组（tuple）
"""


def sum1(*args):
    # 输错了 args 的数据 和类型 (1, 2, 3, 100)
    print(f"args = {args}, 类型是：{type(args)}")
    return sum(args)


# 调用测试
result = sum1(1, 2, 3, 100)
print(f"result = {result}")

"""
10、函数的可变参数/不定长参数 还支持多个关键字参数，也就是多个 "形参名=实参名"
- 应用场景：当调用函数时，不确定传入多少个 关键字参数 的情况
- 传入的多个关键字参数，会被组成一个字典（dict）
"""


def person_info(**kwargs):
    print(f"kwargs = {kwargs}, 类型是：{type(kwargs)}")
    # 遍历 kwargs 是一个字典，下面的 arg_name 就是取出各个参数名
    # args[arg_name] 就是取出参数值
    for arg_name in kwargs:
        print(f"参数名：{arg_name}, 参数值：{kwargs[arg_name]}")


# 测试
person_info(name="hsp", age=18, email="hsp@qq.com")

"""
11、python 调用另一个 .py 文件中的函数
import f1
"""